#ifndef NesSystem_H_INCLUDED
#define NesSystem_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"
#include "NesCPU6502.h"
#include "NesPPU.h"
#include "NesAPU.h"
#include "NesInput.h"


/* 水平镜像（左右） */
#define MIRROR_TYPE_HORIZONTAL 0
/* 垂直镜像（上下） */
#define MIRROR_TYPE_VERTICAL   1
/* 单镜像（低） */
#define MIRROR_TYPE_ONELOW     2
/* 单镜像（高） */
#define MIRROR_TYPE_ONEUPPER   3

typedef struct{
    uint32_t NES_ROM;           /* NES文件起始位置 */
    uint8_t headers[16];        /* NES文件头16个字节数据 */
    uint32_t PRG_ROM;           /* 代码区域起始位置指针 */
    uint32_t CHR_ROM;           /* 图案区域起始位置指针 */

    uint32_t PRG_ROMSize;       /* 程序代码大小 */
    uint32_t PRG_RAMSize;       /* 拓展RAM大小 */
    uint32_t CHR_ROMSize;       /* 图案大小 */

    uint8_t mapperType;         /* mapper类别 */
    uint8_t mirrorType : 3;     /* VRAM镜像模式，0: 垂直 1: 水平 */
    uint8_t backedRAMExist : 1; /* 是否存在backed RAM */
    uint8_t trainerExist : 1;   /* 是否存在trainer */
    uint8_t VRAMExist : 1;      /* 是否存在拓展VRAM */
    uint8_t VSSystemExist : 1;  /* 卡带是否带有VS System */
    uint8_t TVSystemMode : 1;   /* 0: NTSC; 1:PAL */

    uint32_t TVSystemModeSec;   /* 不同制式的帧率 */
    uint8_t runing;             /* 0: disable; 1: enable */

    NesCPUInofType *ptypeCPUInfo;
    NesPPUInofType *ptypePPUInfo;
    NesInputInfoType *ptypeNesInputInfo;

    /* 开始执行时的系统时间（ms），用来同步到50Hz */
    int64_t timeStart;
}NesInfoType;



extern NesInfoType g_typeNesInfo;


int64_t lNesTimeGet(void);
void vNesDelayMs(int32_t iTime);
void vNesMirrorTypeSet(int8_t cMirrorType);
int8_t cNesFlashLoad(char *pucFileName);
int8_t cNesLoad(void);
int8_t cNesStart(void);
int8_t cNesStop(void);
int8_t cNesReset(void);
void vNesInit(void);
void vNesExec(void);
NesInfoType *ptyeNesInfoGet(void);

#ifdef __cplusplus
}
#endif

#endif // NesSystem_H_INCLUDED
